/**
 * 数组工具类
 */
export class ArrUtil {

    /**
     * 从数组中移除首个指定元素
     * @param arr 数组
     * @param val 指定元素
     */
    static remove<T>(arr: T[], val: T) {
        return arr.splice(arr.indexOf(val), 1);
    }

    /**
     * 从数组中移除首个指定元素
     * 此函数十分高效，但会改变数组的元素次序。
     * @param arr 数组
     * @param val 指定元素
     */
    static removeFast<T>(arr: T[], value: T) {
        const idx = arr.indexOf(value);
        if (idx > -1) {
            arr[idx] = arr[arr.length - 1];
            --arr.length;
            return true;
        }
        return false;
    }

    /**
     * 原数组过滤
     * @param arr 
     * @param filter 
     * @param noOneToKeepOrignal 如果一个也没有则保持原来的数组
     */
    static originalFilter<T>(arr: T[], filter: (val: T) => boolean, noOneToKeepOrignal = false) {
        let idx = 0;
        for (let i = 0; i < arr.length; ++i) {
            if (filter(arr[i])) {
                arr[idx++] = arr[i];
            }
        }
        if (noOneToKeepOrignal) {
            if (idx > 0) {
                arr.length = idx;
            }
        } else {
            arr.length = idx;
        }
        return arr;
    }
}